#pragma once

#include "notepad.h"
#include "tunneltype.h"

#include <string>

class TunnelConstructor
{
public:
    struct Pair
    {
        int8_t inbound = 3;
        int8_t outbound = 3;
    };

    TunnelConstructor();

    bool setName(std::string name);
    bool setTunnelType(TunnelType type);
    bool setLength(int8_t inbound, int8_t outbound);
    bool setLengthVariance(int8_t inbound, int8_t outbound);
    bool setQuantity(int8_t inbound, int8_t outbound);
    bool setBlindedLeaseSet(bool isBlinded);
    bool setTransient(bool isTransient);
    bool setKeepAlive(int8_t interval);
    bool setComments(bool enabled);

    std::string name() const { return name_; }
    TunnelType tunnelType() const { return tunnelType_; }
    Pair length() const { return length_; }
    Pair lengthVariance() const { return lengthVariance_; }
    Pair quantity() const { return quantity_; }
    bool isBlinded() const { return blinded_; }
    bool isTransient() const { return transient_; }
    uint8_t keepAliveInterval() const { return keepAliveInterval_; }
    bool isCommentsEnabled() const { return comments_; }

    std::u8string generate() const;

    void setLang(Notepad::Lang lang) { lang_ = lang; }
    std::u8string errorString() const { return errorString_; }

    static std::string tunnelTypeToString(TunnelType type);
    static TunnelType stringToTunnelType(const std::string& type);
    static bool isClientType(TunnelType type); // otherwise this is server

private:
    std::string name_ = "TUNNEL";
    TunnelType tunnelType_ = TunnelType::TcpClient;
    Pair length_;
    Pair lengthVariance_;
    Pair quantity_;
    bool transient_ = false;
    bool blinded_ = false;
    uint8_t keepAliveInterval_ = 0;
    Notepad::Lang lang_ = Notepad::Lang::en;
    bool comments_ = true;

    std::u8string errorString_;
};
